package com.hs.egova.hibernate;



import com.hs.egova.base.Pagination;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * @author husheng
 * @version v1.0
 * @date 2021/7/26 14:10
 * @email husheng@egova.com.cn
 */
public interface BaseDao<T, ID extends Serializable> {

    /**
     * 锁住对象，使其使其不能被其他session更新
     * @param obj
     */
    void lock(Object obj);

    /**
     * 保存或更新
     * @param o
     * @return
     */
    T saveOrUpdate(T o);

    /**
     * 保存Session中有两个持久化实体的情况
     * @param o
     * @return
     */
    T merge(T o);

    /**
     * 保存
     * @param o
     * @return
     */
    T save(T o);

    /**
     * 批量保存
     * @param list
     * @return
     */
    List<T> save(List<T> list);

    /**
     * 批量保存或更新
     * @param list
     * @return
     */
    List<T> saveOrUpdate(List<T> list);

    /**
     * 删除一条
     * @param o
     */
    void delete(T o);

    /**
     * 批量删除
     * @param list
     */
    void delete(List<T> list);

    /**
     * 删除ID对应的对象
     * @param id
     */
    void deleteByID(ID id);

    void deleteAll();

    /**
     * 删除where对应的对象
     * @param where hql 中where语句
     */
    int deleteByWhere(String where);

    /**
     * 删除where对应的对象
     * @param where hql 中where语句
     * @param params where中绑定的参数
     */
    int deleteByWhere(String where, Object... params);

    /**
     * 删除where对应的对象
     * @param where hql 中where语句
     * @param map where中绑定的参数
     */
    int deleteByWhere(String where, Map<String, Object> map);

    /**
     * 获取ID对应的对象
     * @param id
     * @return
     */
    T findById(ID id);

    /**
     * 获取ID对应的对象,并锁定
     * @param id
     * @return
     */
    T findByIdLockMode(ID id);

    /**
     * 列出所有的对象
     * @return
     */
    List<T> listAll();

    /**
     * 获取分页对象列表
     * @param offset
     * @param max
     * @return
     */
    List<T> listAll(int offset, int max);

    /**
     * 获取所有对象数量
     * @return
     */
    Long countAll();

    /**
     * 返回对象数量
     * @param where hql语句where之后部分
     * @return
     */
    Long countByWhere(String where);

    /**
     * 返回对象数量
     * @param where hql语句where之后部分
     * @param params where中绑定的参数
     * @return
     */
    Long countByWhere(String where, Object... params);

    /**
     * 返回对象数量
     * @param where hql语句where之后部分
     * @param map where中绑定的参数
     * @return
     */
    Long countByWhere(String where, Map<String, Object> map);


    /**
     * 执行带参数的命令（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd 命令
     * @param params 参数
     * @return
     */
    int execute(String cmd, Object... params);

    /**
     * 执行带参数的命令（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd 命令
     * @param map 参数
     * @return
     */
    int execute(String cmd, Map<String, Object> map);


    /**
     * 执行不带参数的命令（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd 命令
     * @return
     */
    int execute(String cmd);

    /**
     * 查询
     * @param cmd
     * @return
     */
    List<T> query(String cmd);

    /**
     * 锁定模式查询
     * @param cmd
     * @return
     */
    List<T> queryLockMode(String cmd);

    /**
     * 带有参数的查询（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param params 参数
     * @return
     */
    List<T> query(String cmd, Object... params);

    /**
     * 带有参数的锁定模式查询（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param params 参数
     * @return
     */
    List<T> queryLockMode(String cmd, Object... params);

    /**
     * 带有参数的查询（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param map 参数
     * @return
     */
    List<T> query(String cmd, Map<String, Object> map);

    /**
     * 带有参数的锁定模式查询（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param map 参数
     * @return
     */
    List<T> queryLockMode(String cmd, Map<String, Object> map);

    /**
     * 查询返回Map List
     * @param hql
     * hql格式1 ：select new map(name,passwd) from Users,使用 map.get("0")获取字段
     * hql格式2： select new map(name as username,passwd as password) from Users,使用 map.get("username")获取字段
     * @return
     */
    List<Map<String, Object>> queryForMapList(String hql);

    /**
     * 带有参数的查询返回Map List
     * @param hql
     * hql格式1 ：select new map(name,passwd) from Users,使用 map.get("0")获取字段
     * hql格式2： select new map(name as username,passwd as password) from Users,使用 map.get("username")获取字段
     * @return
     */
    List<Map<String, Object>> queryForMapList(String hql, Object... params);

    /**
     * 带有参数的查询返回Map List
     * @param hql
     * hql格式1 ：select new map(name,passwd) from Users,使用 map.get("0")获取字段
     * hql格式2： select new map(name as username,passwd as password) from Users,使用 map.get("username")获取字段
     * @return
     */
    List<Map<String, Object>> queryForMapList(String hql, Map<String, Object> map);

    /**
     * 返回Map List子列表
     * @param hql
     * @param offset 开始行
     * @param max 最多获取几行
     * @param params
     * @return
     */
    List<Map<String, Object>> querySubMapList(String hql, int offset, int max, Object... params);

    /**
     * 返回Map List子列表
     * @param hql
     * @param offset 开始行
     * @param max 最多获取几行
     * @param map
     * @return
     */
    List<Map<String, Object>> querySubMapList(String hql, int offset, int max, Map<String, Object> map);

    /**
     * 返回Map List子列表
     * @param hql
     * @param offset 开始行
     * @param max 最多获取几行
     * @return
     */
    List<Map<String, Object>> querySubMapList(String hql, int offset, int max);

    /**
     * 查询
     * @param where hql语句where之后部分
     * @return
     */
    List<T> queryByWhere(String where);

    /**
     * 查询
     * @param where hql语句where之后部分
     * @param params where中绑定的参数
     * @return
     */
    List<T> queryByWhere(String where, Object... params);

    /**
     * 查询
     * @param where hql语句where之后部分
     * @param map where中绑定的参数
     * @return
     */
    List<T> queryByWhere(String where, Map<String, Object> map);

    /**
     * 查询一部分列表（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param offset 开始行
     * @param max 最多获取几行
     * @param params 参数
     * @return
     */
    List<T> querySubList(String cmd, int offset, int max, Object... params);

    /**
     * 查询一部分列表（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param offset 开始行
     * @param max 最多获取几行
     * @param  map
     * @return
     */
    List<T> querySubList(String cmd, int offset, int max, Map<String, Object> map);

    /**
     * 查询一部分列表（命令一般为sql语句，hibernate对应hql语句）
     * @param cmd
     * @param offset
     * @param max
     * @return
     */
    List<T> querySubList(String cmd, int offset, int max);

    /**
     * 查询一部分列表（命令一般为sql语句，hibernate对应hql语句）
     * @param where
     * @param offset 开始行
     * @param max 最多获取几行
     * @param params 参数
     * @return
     */
    List<T> querySubListByWhere(String where, int offset, int max, Object... params);

    /**
     * 查询一部分列表（命令一般为sql语句，hibernate对应hql语句）
     * @param where
     * @param offset 开始行
     * @param max 最多获取几行
     * @param map 参数
     * @return
     */
    List<T> querySubListByWhere(String where, int offset, int max, Map<String, Object> map);

    /**
     * 查询一部分列表（命令一般为sql语句，hibernate对应hql语句）
     * @param where
     * @param offset
     * @param max
     * @return
     */
    List<T> querySubListByWhere(String where, int offset, int max);

    /**
     * 得到唯一的对象
     * @param cmd
     * @param params
     * @return
     */
    Object getUniqueObj(String cmd, Object... params);


    /**
     * 得到唯一的对象
     * @param cmd
     * @param map
     * @return
     */
    Object getUniqueObj(String cmd, Map<String, Object> map);

    /**
     * 得到唯一的对象
     * @param cmd
     * @return
     */
    Object getUniqueObj(String cmd);

    /**
     * 获取唯一字符串
     * @param hql
     * @param params
     * @return
     */
    String getString(String hql, Object... params);

    /**
     * 获取唯一字符串
     * @param hql
     * @param map
     * @return
     */
    String getString(String hql, Map<String, Object> map);

    /**
     * 获取唯一整型
     * @param hql
     * @param params
     * @return
     */
    Integer getInteger(String hql, Object... params);

    /**
     * 获取唯一整型
     * @param hql
     * @param map
     * @return
     */
    Integer getInteger(String hql, Map<String, Object> map);

    /**
     * 获取唯一浮点型
     * @param hql
     * @param params
     * @return
     */
    Float getFloat(String hql, Object... params);

    /**
     * 获取唯一浮点型
     * @param hql
     * @param map
     * @return
     */
    Float getFloat(String hql, Map<String, Object> map);

    /**
     * 获取唯一长整型
     * @param hql
     * @param params
     * @return
     */
    Long getLong(String hql, Object... params);

    /**
     * 获取唯一长整型
     * @param hql
     * @param map
     * @return
     */
    Long getLong(String hql, Map<String, Object> map);

    /**
     * 获取唯一日期型
     * @param hql
     * @param params
     * @return
     */
    Date getDate(String hql, Object... params);

    /**
     * 获取唯一日期型
     * @param hql
     * @param map
     * @return
     */
    Date getDate(String hql, Map<String, Object> map);

    /**
     * 获取唯一字符串
     * @param hql
     * @return
     */
    String getString(String hql);

    /**
     * 获取唯一整型
     * @param hql
     * @return
     */
    Integer getInteger(String hql);

    /**
     * 获取唯一长整型
     * @param hql
     * @return
     */
    Long getLong(String hql);

    /**
     * 获取唯一浮点型
     * @param hql
     * @return
     */
    Float getFloat(String hql);

    /**
     * 获取唯一日期型
     * @param hql
     * @return
     */
    Date getDate(String hql);

    /**
     * 获取Map
     * @param hql
     * @param params
     * @return
     */
    Map<String, Object> getMap(String hql, Object... params);

    /**
     * 获取Map
     * @param hql
     * @param map
     * @return
     */
    Map<String, Object> getMap(String hql, Map<String, Object> map);

    /**
     * 获取Map
     * @param hql
     * @return
     */
    Map<String, Object> getMap(String hql);

    /**
     * 载入Lasy Entity
     * @param entity
     */
    void loadLazyEntity(Object entity);

    /**
     * 分页
     * @param cmd
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @return
     */
    Pagination<T> getPagination(String cmd, int currentPage, int numPerPage);

    /**
     * 分页
     * @param cmd
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @param params cmd参数
     * @return
     */
    Pagination<T> getPagination(String cmd, int currentPage, int numPerPage, Object... params);

    /**
     * 分页
     * @param cmd
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @param map cmd参数
     * @return
     */
    Pagination<T> getPagination(String cmd, int currentPage, int numPerPage, Map<String, Object> map);

    /**
     * 分页
     * @param sql
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @return
     */
    Pagination<T> getPaginationForSql(String sql, int currentPage, int numPerPage);

    /**
     * 分页
     * @param sql
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @param map sql参数
     * @return
     */
    Pagination<T> getPaginationForSql(String sql, int currentPage, int numPerPage, Map<String, Object> map);
    /**
     * 用sql获取唯一整形
     * @param sql
     * @return
     */
    Integer getIntegerForSql(String sql);

    /**
     * 判断SQL查询语句是否合法
     * @param sql
     * @return
     */
    boolean checkForSqlQuery(String sql);

    /**
     * 分页
     * @param where
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @return
     */
    Pagination<T> getPaginationByWhere(String where, int currentPage, int numPerPage);

    /**
     * 分页
     * @param where
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @param params cmd参数
     * @return
     */
    Pagination<T> getPaginationByWhere(String where, int currentPage, int numPerPage, Object... params);

    /**
     * 分页
     * @param where
     * @param currentPage 当前页
     * @param numPerPage 每页条数
     * @param map cmd参数
     * @return
     */
    Pagination<T> getPaginationByWhere(String where, int currentPage, int numPerPage, Map<String, Object> map);

    /**
     * 将语句转化为sql
     * @param cmd
     * @return
     */
    String cmdToSql(String cmd);

    /**
     * 获取当前时间
     * @return
     */
    Date getCurrentDatetime();

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @return
     */
    Integer getColumnMaxIntegerValue(String column);

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @param where where条件
     * @return
     */
    Integer getColumnMaxIntegerValue(String column, String where);

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @param where where条件
     * @param params 参数
     * @return
     */
    Integer getColumnMaxIntegerValue(String column, String where, Object... params);

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @param where where条件
     * @param map 参数
     * @return
     */
    Integer getColumnMaxIntegerValue(String column, String where, Map<String, Object> map);

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @return
     */
    Long getColumnMaxLongValue(String column);


    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @param where where条件
     * @return
     */
    Long getColumnMaxLongValue(String column, String where);

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @param where where条件
     * @param params 参数
     * @return
     */
    Long getColumnMaxLongValue(String column, String where, Object... params);

    /**
     * 获取列最大值，如果为空返回0
     * @param column 列名，此处为hibernate javaBean字段名
     * @param where where条件
     * @param map 参数
     * @return
     */
    Long getColumnMaxLongValue(String column, String where, Map<String, Object> map);

    /**
     * 执行sql
     * @param sql
     * @param params
     * @return
     */
    int excuteSql(String sql, Object... params);

    /**
     * 执行sql
     * @param sql
     * @param map
     * @return
     */
    int excuteSql(String sql, Map<String, Object> map);

    /**
     * 执行sql
     * @param sql
     * @return
     */
    int excuteSql(String sql);

    /**
     * 获取表名
     * @return
     */
    String getTableName();

    /**
     * 重置自增序列值（只用于MySQL，由于MySQL重启后innodb将重用已经删除的自增值）
     * @param increment
     */
    void setAutoIncrement(int increment);

    /**
     * 重置自增序列值（只用于MySQL，由于MySQL重启后innodb将重用已经删除的自增值）
     * @param increment
     */
    void setAutoIncrement(long increment);

    /**
     * 得到唯一的对象
     * @param sql
     * @param params
     * @return
     */
    Object getUniqueObjBySql(String sql, Object... params);

    /**
     * 获取自增序列int值（只用于MySQL）
     * @return
     */
    Integer getIntegerAutoIncrement();

    /**
     * 获取自增序列long值（只用于MySQL）
     * @return
     */
    Long getLongAutoIncrement();

    /**
     * 获取当前实体类对应的所有字段名
     * @return
     */
    Set<String> getColumns();

    /**
     * 获取实体类对应的所有字段名
     * @param classType
     * @return
     */
    @SuppressWarnings("rawtypes")
    Set<String> getColumns(Class classType);

}
